package utils

import (
	"sort"
)

// 切片去重复
func RemoveDuplicatesInPlace(userIDs []string) []string {
	// 如果有0或1个元素，则返回切片本身。
	if len(userIDs) < 2 {
		return userIDs
	}

	//  使切片升序排序
	sort.SliceStable(userIDs, func(i, j int) bool { return userIDs[i] < userIDs[j] })

	uniqPointer := 0

	for i := 1; i < len(userIDs); i++ {
		// 比较当前元素和唯一指针指向的元素
		//  如果它们不相同，则将项写入唯一指针的右侧。
		if userIDs[uniqPointer] != userIDs[i] {
			uniqPointer++
			userIDs[uniqPointer] = userIDs[i]
		}
	}

	return userIDs[:uniqPointer+1]
}

// ConvertStrSlice2Map 将字符串 slice 转为 map[string]struct{}。
/*
m := ConvertStrSlice2Map(sl)
*/
func ConvertStrSlice2Map(sl []string) map[string]struct{} {
	set := make(map[string]struct{}, len(sl))
	for _, v := range sl {
		set[v] = struct{}{}
	}
	return set

	//==============协程处理==================
	/*
		存储变量问题，7307114万数据去重
		单线程:4秒
		信道:16秒
		sync.Map：36.6431181s
		互斥锁:15秒
		读写锁:15秒
	*/
	// var wg sync.WaitGroup
	// // var set sync.Map
	// // var mutex sync.Mutex //互斥锁
	// res := make(map[string]struct{})
	// var goNum = 100 //一次协程处理x个数据
	// count := len(sl)
	// // var mathCeli int = int(math.Ceil(float64(count) / float64(goNum)))
	// // wg.Add(mathCeli)

	// var datass []string
	// ss := 0
	// ch := make(chan string)
	// for _, v := range sl {
	// 	datass = append(datass, v)
	// 	// fmt.Println(v, ss, count)
	// 	if (ss+1)%goNum == 0 || ss+1 == count {
	// 		// fmt.Println("ConvertStrSlice2Map go 之前", count, ss)
	// 		wg.Add(1)
	// 		// var v1 = make(map[string]struct{})
	// 		go func(datass []string) {
	// 			for _, value := range datass {
	// 				// fmt.Println(value)
	// 				// if value == "" || len(value) == 0 {
	// 				// 	continue
	// 				// }
	// 				ch <- value
	// 				// v1[value] = struct{}{}
	// 				// mutex.Lock()
	// 				// defer rwMutex.Unlock()
	// 				// res[value] = struct{}{}
	// 				// mutex.Unlock()
	// 				// set.Store(value, struct{}{})
	// 				// set[value] = struct{}{}
	// 			}
	// 			wg.Done()
	// 		}(datass)
	// 		datass = nil
	// 	}
	// 	ss++
	// }
	// // fmt.Println("ConvertStrSlice2Map 结果", count, ss)
	// for {
	// 	v1, ok := <-ch
	// 	res[v1] = struct{}{}
	// 	count--
	// 	// fmt.Println(v1, count, ok, len(res))
	// 	if ok && count <= 0 {
	// 		close(ch)
	// 		break
	// 	}
	// }
	// wg.Wait()

	// //安全map取值方法

	// // set.Range(func(k, v interface{}) bool {
	// // 	res[k.(string)] = struct{}{}
	// // 	return true
	// // })
	// // fmt.Println(res)
	// return res
}
